public class Solution {
    public static void main(String[] args) {
        Solution s = new Solution();
        System.out.println(s.multiply("123","456"));
    }

    public String multiply1(String num1, String num2) {
        /**
         * 字符串相乘
         * 解法：
         *  高精度乘法（实质就是模拟）
         * 模拟思路：
         *  逆向相乘，顺向相加，保持进位与空格，结果逆转即可，单独实现用时2h
         *      1，逆向相乘，模拟竖式相乘从个位操作的逻辑
         *      2，顺向相加带进位空格（所得结果为逆序）
         *      3，循环1、2，将上次和与本次乘积相加，由于本次为逆序，上次也为逆序，故总体逆序
         *  我也不知道咋想出来的，反正慢慢调试就对了*/
        // 1 预处理
        int n1 = num1.length();
        int n2 = num2.length();

        // 2 模拟列竖式相乘
        StringBuilder prev = new StringBuilder();
        int count = 0;
        int t;
        for(int i = n1-1; i >= 0; i--) {
            t = 0;
            // -1 模拟单数乘法（带进位）
            StringBuilder cur = new StringBuilder();
            // -- 对应进位相加
            for(int h = 0; h < count; h++) {
                cur.append(0);
            }
            for(int j = n2-1; j >= 0; j--) {
                t += ((num1.charAt(i)-'0') * (num2.charAt(j)-'0'));
                cur.append(t%10);
                t /= 10;
            }
            if(t != 0) {
                cur.append(t);
            }
            // -2 相加
            t = 0;
            StringBuilder sum = new StringBuilder();
            int k = 0;
            while(cur.length() > k && prev.length() > k) {
                t += ((cur.charAt(k)-'0') + (prev.charAt(k)-'0'));
                sum.append(t%10);
                t /= 10;
                k++;
            }
            // -- 要时刻维持进位，不可偷懒（看来相加和相乘的进位都是一样的，要始终维护！）
            while(cur.length() > k) {
                t += cur.charAt(k) - '0';
                sum.append(t % 10);
                t /= 10;
                k++;
            }
            while(prev.length() > k) {
                t += prev.charAt(k) - '0';
                sum.append(t % 10);
                t /= 10;
                k++;
            }
            if(t != 0) {
                sum.append(t);
            }
            prev = sum;
            count ++;
        }

        // 3 返回值
        prev.reverse();
        int i = 0;
        while(i < prev.length()) {
            if(prev.charAt(i) != '0') {
                break;
            }
            i ++;
        }
        if(i == prev.length()) {
            return "0";
        } else {
            return prev.toString();
        }
    }

    public String multiply(String num1, String num2) {
        /**
         * 字符串相乘
         * 解法1的纯模拟过程太过于难以理解
         * 解法2：利用123 * 78 = （（1*78）*10 + 2*78）*10 + 3*78
         * 此法还是要解决a * num2，此时num2可能是一个超大的数，因此不可取*/
        // 1 预处理
        int n1 = num1.length();
        int n2 = num2.length();

        // 2 模拟列竖式相乘
        StringBuilder prev = new StringBuilder();
        prev.append(0);
        for(int i = 0; i < n1; i++) {

        }
    }
}
